#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
第一行注释是为了告诉Linux/OS X系统，这是一个Python可执行程序，Windows系统会忽略这个注释；

第二行注释是为了告诉Python解释器，按照UTF-8编码读取源代码，否则，你在源代码中写的中文输出可能会有乱码。
'''

# http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

#------------ Python基础 ----------------- 

print('hello world!');
print(100+200);
#接受用户输入
#name = input("please enter your name:");
a = 100
if a >= 0: #，冒号结束后 缩进的语句视为代码块。
    print(a); #这行不缩进时是不能执行的,会报错
else:
	print(-a);

#可以用'''...'''代替\n来换行,不太明白
print('''line1
line2
line3''');

print(True);#必须大写T
print(False);#必须大写F
print(None);#必须大写N

str = "abc";#这是字符串类型数据
b = b"abc";#这是字节类型的数据

print(len(str));#表示有多少个字符 3
print(len(b));#表示字符占多少个字节 3

cn = "中文";
cnb=cn.encode("utf-8");#把字符串转换成byte类型
cn = cnb.decode("utf-8");

print(cnb,"cnb len=",len(cnb),cn,len(cn));

#字符串和编码 ---------------

#---------------- 格式化输出字符串 ----------
'''
常用占位符

%d	整数
%f	浮点数
%s	字符串
%x	十六进制整数


%s 可以通用所有占位符
'''
s1 = 72;
s2 = 85;
r = s2 - s1;
print(r);
r = r/s2;
print(r);
print("小明成绩提升了%.1f"%(r));#四舍五入保留一位小数点,
import math
print(round(math.pi,2)) #设置保留的小数点 
print(round(math.pi)) #四舍五入

#forma函数格式化的使用
s1 = "{0}是一个好人,来自{1}".format("kfz","gz")
s1 = "{0}是一个好人,来自{1[1]}".format("kfz",['gz','sz'])
s1 = "{0[a]}是一个好人,来自{1[1]}".format({"a":1,"b":2},["gz","sz"])

#------------ 使用list和tuple -------

#list 就是数组;和AS3数组一样可以储存任何数据类型
classmates = ["jok","leo","kf","zhou","郭"];

print(ord('A')) #获取Unicode编码

lenght = len(classmates); #数组长度
last1 = classmates[-1];#最后一个元素
last2 = classmates[-2];#倒数第二个元素

classmates.append("hui");# append函数追加元素到末尾

classmates.insert(1,"jun");#插入元素
last = classmates.pop();#删除最后一个元素
print("last 11=",last);
last = classmates.pop(2);#删除指定索引的元素
print("last 22=",last);

L = [1,2,3,4,5,6]
print(L[2:5]) #不改变原列表 返回切片段的副本
print(L)

#通过切片改变列表
L[2:5] = ['x','y']; #改变了原列表
print('改变了原列表',L,L[0])

arr1 = [1,2,3,'四','五','六']
arr2 = [7,8,9]
copy1 = arr1[:] #快速复制一个list,不影响原list
print('快速复制一个list=',copy1) 

#快速合并两个list
megerArr = arr1+arr2 
megerArr2 = arr1.extend(arr2)
print("快速合并两个list=",megerArr)

#tuple 元组,可以说是一种特殊的数据,初始化之后就不能改变长度和元素内容

animals = ("dog","cat","rabbit");#初始化方式和list不一样

dog = animals[0];#访问和list一样
print("tuple=",dog);

#定义只有一个元素的tuple
t1 = (1,); #不加逗号会当作是一个数字
print(t1);

#------------ 条件判断 if语句 -------

#if语句的写法，缩进不能少，某号不能少

age = 10;
if age > 10:
    print("大过10岁仔");
elif age==10:
    print("10岁仔");
else:
	print("细过10岁仔");
print("哈哈哈");

#穿插,字符串转换成整型

year = "2001";#input("birth:");

year = int(year);#转换
if year > 2000:
	print("00后");
else :
	print("非00后");

# -------------- 循环语句 ----------
#有两种循环语句

#1.for .. in .. 循环

arr = ["zhou","hong","hui"];
i = 0;

#同样是冒号和缩进不能少
for name in arr:
    i = i+1;
    print("arr=",name,"i=",i); #依次循环打印
#range(n)函数即系生成0-(n-1)的正数序列
seqInt = range(3);#生成0-3的正数系列
intList = list(seqInt);#把系列转换成list

for i in intList:
    print("intList=",i);

#2.while循环
sum = 0;
n = 99;
while n>0:
	sum = sum + n;
	n = n-2;
print("while sum=",sum);


#---------------- 使用dict和set ------------

#dict同as3的dictionary;但是不能点访问属性

score = {"zhou":89};
score['hui'] = 100;
score['hong'] = "你好";
print("score.zhou=",score['zhou']);

#如果键hui存在则返回值，否则返回-1,不指定-1返回None,通常用于判断key是否存在
print(score.get("hui",-1)); 

#另一种判断key是否存在的办法
key ='hui';
isExist = key in score;
print("isExist=",isExist);

if not isExist:
	print("键",key,"不存在score中score=",score);
else :
	print("键",key,"存在score中score=",score);

	
#删除key
score.pop(key);#key不存在会抛错

d1 = dict((['name','zhou'],['age',25])) #创建dict的特殊方法; 一个set里面是多个key-value的list
print("------------------------ d1=",d1)

'''

和list比较，dict有以下几个特点：

查找和插入的速度极快，不会随着key的增加而增加；
需要占用大量的内存，内存浪费多。

而list相反：

查找和插入的时间随着元素的增加而增加；
占用空间小，浪费内存很少。

所以，dict是用空间来换取时间的一种方法。

dict的查找和插入的速度不受key的个数影响,消耗内存大
list的查找和插入速度会随着元素增加而增加，但是占用内存小

'''
#set是一组key的集合，但不存储value。由于key不能重复，所以，在set中，没有重复的key。
#set是一组无序的集合,可以计算交集,并集,差集

st1 = set(["z",1,2,5,8,9,"f",1,25,2,5,'a']); #创建set,自动过滤掉重复的键

print("st=",st1);

c = [i for i in st1];#好屌,这样就可以把set转换成list了
print("c=",c);

st2 = set([1,2,3,4]);
print("st2=",st2,)

st3 = set([3,4,5,6]);
print("st3=",st3,)

#交集
stSame = st2 & st3;
print("stSame=",stSame);# 3,4

#并集
stAdd = st2 | st3;
print("stAdd=",stAdd);# 1,2,3,4,5,6

#差集
stMinus = st2 - st3;
print("stMinus=",stMinus); # 1,2

# 对称差集（项在t或s中，但不会同时出现在二者中）
stSymmetry = st2 ^ st3;# 1,2,5,6       
print("stSymmetry=",stSymmetry);

print("7除以3等于%.2f "%(7/3));
print("7除以3向下取整等于%d "%(7//3)); #向下取整的除法
print("7除以3的余数等于%d "%(7%3)); #求模

#基础部分算看完了

'''
1. 如果模块是被导入，__name__的值为模块名字
2. 如果模块是被直接执行，__name__的值为’__main__’
'''



